package com.juzipi.demo.utils;

//封装一个 jwt 工具类

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.apache.commons.lang3.StringUtils;

import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import java.util.Random;

public class JWTUtils {

    //盐
    private static String salt(int n){
        return getSalt(n);
    }

    private static final String SALT = "ming";

    /**
     * 生成salt的静态方法
     * @param n
     * @return
     */
    public static String getSalt(int n){
        char[] chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+{}:<>?|1234567890-=[];',./".toCharArray();
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < n; i++) {
            char aChar = chars[new Random().nextInt(chars.length)];
            stringBuilder.append(aChar);
        }
        return stringBuilder.toString();
    }


    //生成token   header payload signature 头 荷载 签名
    public static String getToken(Map<String,String> map){
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.MINUTE,10);//10分钟

        JWTCreator.Builder builder = JWT.create();
//        builder.withHeader()//头部就用默认的了 默认是这个算法：HMAC256
        //遍历map
        //放入传来的 key 和 value，作为 payload 荷载
        map.forEach(builder::withClaim);

//        builder.withIssuer("juzipi");//发布者
//        builder.withSubject("前后分离鉴权");//主题
//        builder.withIssuedAt(new Date());//生成签名的时间
//        builder.withAudience("vue-advanced");//观众，接收者吧
//        builder.withNotBefore(new Date());//生效的时间
//        builder.withJWTId("7520");//编号

        //signature 签名
        String token = builder.withExpiresAt(instance.getTime())//指定令牌过期时间
                //传入int类型的数据来确定盐的位数
                .sign(Algorithm.HMAC256(SALT));//这里要和头部加密的方法一致
        return token;


//        String token = JWT.create()
//                .withClaim("userId", )//荷载
//                .withClaim("username", )
//                .withExpiresAt(instance.getTime())//指定令牌过期时间
//                .sign(Algorithm.HMAC256(SALT));//签名
//        return token;
    }


    /**
     * 验证 token
     */
    public static DecodedJWT verify(String token) {
        try {
            if (StringUtils.isNotBlank(token)){
                //验证通过直接返回
                DecodedJWT verify = JWT.require(Algorithm.HMAC256(SALT)).build().verify(token);
                System.out.println("JWT token验证通过");
                return verify;
            }
        } catch (JWTVerificationException | IllegalArgumentException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 获取 token 信息的方法
     */
//    public static DecodedJWT getTokenInfo(String token){
//        DecodedJWT verify = JWT.require(Algorithm.HMAC256(SALT)).build().verify(token);
//        //直接返回
//        return verify;
//    }

}
